package co.edu.usbcali.egrapico.logica;

/**
 * Clase para la traducci�n de la representaci�n de la
 * <Code>Parte L�gica de
 * un Proceso</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo PiCO</I>. <P>
 * Recibe en <I>GraPiCO Textual</I> la parte L�gica de un Proceso:<P> <Blockquote><Pre>
 *                   �mbito       ->   [ListaVariables;ListaNombre;Programa]
 *                   Implicaci�n  ->   < Antecedente;Consecuente>
 *                   Objeto       ->   (RestriccioneRecepci�n,RestriccioneDelegaci�n)�[ListaM�todos]
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I>:<P> <Blockquote><Pre>
 *                   ParteL�gicaProceso
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class ProcessLogicalPart {

    // Variable para almacenar la clasificaci�n de la parte l�gica del proceso
    // ya sea �mbito, implicaci�n u objeto.
    char SyncSymbol;
    // Variable para almacenar la parte l�gica del proceso
    // representado en c�lculo PiCO.
    String processLogicalPartPico = "";
    // Variable para almacenar la parte l�gica del proceso
    // representado en GraPiCO Textual.
    String processLogicalPartGPT = "";
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de la clase
     * <Code>ProcessLogicalPart</Code>.<P> Obtiene el primer caracter de la
     * expresi�n como el s�mbolo de sincronizaci�n, el cual le permitir� saber
     * si se trata de un
     * <Code>�mbito</Code>, una
     * <Code>Implicaci�n</Code> o un
     * <Code>Objeto</Code>.
     *
     * @param processLPGraPicoT Expresi�n equivalente a la representaci�n de la
     * parte l�gica de un proceso en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de los procesos que se est�n
     * traduciendo.
     */
    public ProcessLogicalPart(String processLPGraPicoT, String nameProcess) {

        // Se obtiene el nombre del proceso
        nameCurrentProcess = nameProcess;

        // Se obtiene el primer caracter como simbolo de sincronizaci�n
        SyncSymbol = processLPGraPicoT.charAt(0);

        // Se obtiene la parte l�gica del proceso
        processLogicalPartGPT = processLPGraPicoT;

    }

    /**
     * Metodo generador de la traducci�n de la
     * <Code>Parte L�gica de
     * un Proceso</Code>.<P> Obtiene la traducci�n de un
     * <Code>�mbito</Code>, una
     * <Code>Implicaci�n</Code> o un
     * <Code>Objeto</Code> seg�n el s�mbolo de sincronizaci�n obtenido por el
     * constructor.
     *
     * @return la
     * <Code>Parte L�gica de un Proceso</Code> traducida a <I>C�lculo PiCO</I>.
     */
    public String traslate() {
        switch (SyncSymbol) {
            case '[':	//Definici�n de �mbito
                Scope scope = new Scope(processLogicalPartGPT, nameCurrentProcess);
                processLogicalPartPico = scope.traslate();
                break;
            case '<':	//Definici�n de implicaci�n
                Implication implication = new Implication(processLogicalPartGPT, nameCurrentProcess);
                processLogicalPartPico = implication.traslate();
                break;
            case '(':	//Definici�n de objeto
                Object objeto = new Object(processLogicalPartGPT, nameCurrentProcess);
                processLogicalPartPico = objeto.traslate();
                break;
            default:
                break;
        }
        return processLogicalPartPico;
    }
}